#if _MSC_VER
 #pragma once
#endif // _MSC_VER

#ifndef __HERZELEID_STATESWAPSET_INCLUDED__
 #define __HERZELEID_STATESWAPSET_INCLUDED__
 #include "HerzeleidRendererModelCore.hxx"
 #include "HerzeleidRendererFixed.hxx"

//////////////////////////////////////////////////////////////////////////////////////////////
HerzeleidRendererStatesNamespaceBegin struct InputAssemblerSwapSet
{
	typedef HerzeleidRendererResourcesNamespaceImpl::Buffer Buffer; TinyTypeDecl( Buffer );
	typedef HerzeleidRendererResourcesNamespaceImpl::InputLayout Layout; TinyTypeDecl( Layout );

	LayoutPtr InputLayout;
	D3D11_PRIMITIVE_TOPOLOGY eTopology;

	BufferPtr IndexBuffer;
	UInt32 IndexBufferOffset;
	DXGI_FORMAT eIndexBufferFormat;
	UInt32 VertexOffsetArray[HERZELEID_VERTEX_BUFFER_NUM_SLOTS];
	UInt32 VertexStrideArray[HERZELEID_VERTEX_BUFFER_NUM_SLOTS];
	BufferPtr VertexBufferArray[HERZELEID_VERTEX_BUFFER_NUM_SLOTS];

	InputAssemblerSwapSet();
	Void ReleaseAll();
	Void ClearAll();
	
} HerzeleidRendererStatesNamespaceEnd;
//////////////////////////////////////////////////////////////////////////////////////////////
HerzeleidRendererStatesNamespaceBegin struct OutputMergerSwapSet
{
	typedef HerzeleidRendererResourcesNamespaceImpl::UnorderedAccessView UAV; TinyTypeDecl( UAV );
	typedef HerzeleidRendererResourcesNamespaceImpl::DepthStencilState DSS; TinyTypeDecl( DSS );
	typedef HerzeleidRendererResourcesNamespaceImpl::DepthStencilView DSV; TinyTypeDecl( DSV );
	typedef HerzeleidRendererResourcesNamespaceImpl::RenderTargetView RTV; TinyTypeDecl( RTV );
	typedef HerzeleidRendererResourcesNamespaceImpl::BlendState BS; TinyTypeDecl( BS );
	typedef DirectX::XMFLOAT4A Float32x4; TinyTypeDecl( Float32x4 );

	BSPtr BlendState;
	UInt32 StencilRef;
	UInt32 SampleMask;
	Float32x4 BlendFactor;
	DSVPtr DepthStencilView;
	DSSPtr DepthStencilState;
	RTVPtr RenderTargetViewArray[HERZELEID_RTV_NUM_SLOTS];
	UAVPtr UnorderedAccessViewArray[HERZELEID_UAV_NUM_SLOTS];
	UInt32 UnorderedAccessViewInitialCountArray[HERZELEID_UAV_NUM_SLOTS];

	OutputMergerSwapSet();
	Void ReleaseAll();
	Void ClearAll();
	
} HerzeleidRendererStatesNamespaceEnd;
//////////////////////////////////////////////////////////////////////////////////////////////
HerzeleidRendererStatesNamespaceBegin struct RasterizerSwapSet
{
	typedef HerzeleidRendererResourcesNamespaceImpl::RasterizerState RS; TinyTypeDecl( RS );

	RSPtr RasterizerState;
	D3D11_RECT ScissorRectArray[HERZELEID_VIEWPORT_NUM_SLOTS];
	D3D11_VIEWPORT ViewportArray[HERZELEID_VIEWPORT_NUM_SLOTS];

	RasterizerSwapSet();
	Void ReleaseAll();
	Void ClearAll();
	
} HerzeleidRendererStatesNamespaceEnd;
//////////////////////////////////////////////////////////////////////////////////////////////

#endif // !__HERZELEID_STATESWAPSET_INCLUDED__